#include <stdio.h>
#include <stdint.h>

#define PAGE_SIZE 4096
#define PAGE_TABLE_BASE 0x100000
#define PAGE_TABLE_ENTRY_SIZE 4

// 模拟页表（在真实情况下，这会在内存中）
uint32_t page_table[] = {
    0x200000,  // 第一个虚拟页映射到物理页帧基地址 0x200000
    0x210000,  // 第二个虚拟页映射到物理页帧基地址 0x210000
    0x220000,  // 第三个虚拟页映射到物理页帧基地址 0x220000
    0x230000   // 第四个虚拟页映射到物理页帧基地址 0x230000
};

uint32_t translate_address(uint32_t virtual_address) {
    // 从虚拟地址中提取页号和页内偏移
    uint32_t page_number = virtual_address / PAGE_SIZE;
    uint32_t offset = virtual_address % PAGE_SIZE;

    // 使用页号查找页表中的对应物理页帧地址
    uint32_t page_frame_base_address = page_table[page_number];

    // 计算物理地址
    uint32_t physical_address = page_frame_base_address + offset;

    return physical_address;
}

int main() {
    uint32_t virtual_address;

    printf("请输入虚拟地址（十六进制）：");
    scanf("%x", &virtual_address);

    uint32_t physical_address = translate_address(virtual_address);

    printf("对应的物理地址是：0x%x\n", physical_address);

    return 0;
}
